.syntax unified
.cpu cortex-m3
.thumb
.text
.global _dl_jump
_dl_jump:

#ifdef __i386__
.type	_dl_jump,@function

	pushl	%eax		# save register args...
	pushl	%ecx
	pushl	%edx

	pushl	%ebx

	pushl	20(%esp)	# 2. arg from plt
	pushl	20(%esp)	# 1. arg from plt

#ifdef __DYN_LIB
	call	1f
1:	popl	%ebx
	addl	$_GLOBAL_OFFSET_TABLE_+[.-1b],%ebx
	call	do_rel@PLT
#else
	call	do_rel
#endif
	addl	$8, %esp

	popl	%ebx

	popl	%edx		# restore register args...
	popl	%ecx

	xchgl	%eax, (%esp)	# restore eax and save function pointer (for return)

	ret	$8		# remove arguments from plt and jump to REAL function

#endif

#ifdef __arm__
.type	_dl_jump,function

	stmdb	sp!, {r0, r1, r2, r3}
	sub	r1, ip, lr
	sub	r1, r1, #4
	add	r1, r1, r1		/* dyntab entry */
	ldr	r0, [lr, #-4]		/* dynlib handle */
#ifdef __DYN_LIB
	bl	do_rel(PLT)
#else
	bl	do_rel
#endif
	mov	r12, r0
	ldmia	sp!, {r0, r1, r2, r3, lr}
	mov	pc, r12

#endif
